package com.smart.community.property.controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.smart.community.commons.entity.property.UserPropertyCompany;
import com.smart.community.feign.property.dto.PropertyCompanyDataScopeVO;
import com.smart.community.property.service.DataScopeService;
import com.smart.community.property.service.IPropertyCompanyCommunityService;
import com.smart.community.property.service.IUserPropertyCompanyService;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;

/**
 * 物业公司数据权限Feign接口实现Controller
 * 
 * 提供物业公司人员的层级数据权限查询功能：
 * 物业公司 → 社区集合 → 楼栋集合 → 单元集合 → 房户集合 → 用户集合
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-01-30
 */
@Slf4j
@RestController
@RequestMapping("/feign/property-company-data-scope")
@Tag(name = "物业公司数据权限Feign接口", description = "物业公司数据权限相关Feign接口")
public class PropertyCompanyDataScopeFeignController {

    @Autowired
    private DataScopeService dataScopeService;

    @Autowired
    private IUserPropertyCompanyService userPropertyCompanyService;

    @Autowired
    private IPropertyCompanyCommunityService propertyCompanyCommunityService;
    


    /**
     * 检查用户是否有关联的物业公司
     * 
     * @param userId 用户ID
     * @return 是否有关联物业公司
     */
    @GetMapping("/check-property-company/{userId}")
    @Operation(summary = "检查用户是否有关联的物业公司")
    public Boolean checkUserHasPropertyCompany(@Parameter(description = "用户ID") @PathVariable("userId") Long userId) throws Exception {
        log.info("检查用户是否有关联的物业公司，用户ID：{}", userId);
        List<UserPropertyCompany> userPropertyCompanies = userPropertyCompanyService.getUserPropertyCompanies(userId);
        boolean hasPropertyCompany = userPropertyCompanies != null && !userPropertyCompanies.isEmpty();
        
        log.info("用户{}是否有关联的物业公司：{}，关联数量：{}", userId, hasPropertyCompany, 
                userPropertyCompanies != null ? userPropertyCompanies.size() : 0);
        
        return hasPropertyCompany;
    }

    /**
     * 获取用户关联的物业公司ID
     * 
     * @param userId 用户ID
     * @return 物业公司ID，没有关联则返回null
     */
    @GetMapping("/property-company-id/{userId}")
    @Operation(summary = "获取用户关联的物业公司ID")
    public Long getUserPropertyCompanyId(@Parameter(description = "用户ID") @PathVariable("userId") Long userId) throws Exception {
        log.info("获取用户关联的物业公司ID，用户ID：{}", userId);
        List<UserPropertyCompany> userPropertyCompanies = userPropertyCompanyService.getUserPropertyCompanies(userId);
        if (userPropertyCompanies != null && !userPropertyCompanies.isEmpty()) {
            Long propertyCompanyId = userPropertyCompanies.get(0).getPropertyCompanyId();
            log.info("用户{}关联的物业公司ID：{}", userId, propertyCompanyId);
            return propertyCompanyId;
        }
        
        log.info("用户{}未关联任何物业公司", userId);
        return null;
    }

    /**
     * 根据物业公司ID获取关联的社区ID集合
     * 这是数据权限第1步：物业公司 → 社区集合
     * 
     * @param propertyCompanyId 物业公司ID
     * @return 社区ID集合
     */
    @GetMapping("/communities-by-property-company/{propertyCompanyId}")
    @Operation(summary = "根据物业公司ID获取关联的社区ID集合")
    public List<Long> getCommunityIdsByPropertyCompanyId(@Parameter(description = "物业公司ID") @PathVariable("propertyCompanyId") Long propertyCompanyId) throws Exception {
        log.info("根据物业公司ID获取关联的社区ID集合，物业公司ID：{}", propertyCompanyId);
        List<Long> communityIds = propertyCompanyCommunityService.getCommunityIdsByPropertyCompanyId(propertyCompanyId);
        log.info("物业公司{}关联的社区数量：{}", propertyCompanyId, communityIds != null ? communityIds.size() : 0);
        return communityIds != null ? communityIds : new ArrayList<>();
    }

    /**
     * 根据用户ID获取其物业公司关联的社区ID集合
     * 组合查询：用户 → 物业公司 → 社区集合
     * 
     * @param userId 用户ID
     * @return 社区ID集合
     */
    @GetMapping("/communities-by-user/{userId}")
    @Operation(summary = "根据用户ID获取其物业公司关联的社区ID集合")
    public List<Long> getCommunityIdsByUserId(@Parameter(description = "用户ID") @PathVariable("userId") Long userId) throws Exception {
        log.info("根据用户ID获取其物业公司关联的社区ID集合，用户ID：{}", userId);
        // 1. 获取用户关联的物业公司ID
        Long propertyCompanyId = getUserPropertyCompanyId(userId);
        if (propertyCompanyId == null) {
            log.info("用户{}未关联物业公司，返回空社区列表", userId);
            return new ArrayList<>();
        }

        // 2. 根据物业公司ID获取社区ID集合
        List<Long> communityIds = getCommunityIdsByPropertyCompanyId(propertyCompanyId);
        log.info("用户{}通过物业公司{}可访问的社区数量：{}", userId, propertyCompanyId, communityIds.size());
        return communityIds;
    }



    /**
     * 获取用户的完整数据权限范围
     * 一次性获取用户可访问的所有层级数据ID集合
     * 
     * @param userId 用户ID
     * @return 数据权限范围对象
     */
    @GetMapping("/complete-data-scope/{userId}")
    @Operation(summary = "获取用户的完整数据权限范围")
    public PropertyCompanyDataScopeVO getCompleteDataScope(@Parameter(description = "用户ID") @PathVariable("userId") Long userId) throws Exception {
        log.info("获取用户的完整数据权限范围，用户ID：{}", userId);
        // 1. 检查用户是否为超级管理员
        boolean isSuperAdmin = dataScopeService.isUserSuperAdmin(userId);
        
        // 2. 检查用户是否有关联物业公司
        boolean hasPropertyCompany = checkUserHasPropertyCompany(userId);
        
        // 3. 获取用户关联的物业公司ID
        Long propertyCompanyId = getUserPropertyCompanyId(userId);
        
        // 4. 创建数据权限范围对象
        PropertyCompanyDataScopeVO dataScopeVO = new PropertyCompanyDataScopeVO(userId, propertyCompanyId, isSuperAdmin, hasPropertyCompany);
        
        // 5. 如果不是超级管理员且有关联物业公司，获取各层级数据ID集合
        if (!isSuperAdmin && hasPropertyCompany && propertyCompanyId != null) {
            // 获取社区ID集合
            List<Long> communityIds = getCommunityIdsByPropertyCompanyId(propertyCompanyId);
            dataScopeVO.setCommunityIds(communityIds);
            
            // TODO: 获取其他层级数据ID集合（需要实现区域服务和用户服务的Feign调用）
            dataScopeVO.setBuildingIds(new ArrayList<>());
            dataScopeVO.setUnitIds(new ArrayList<>());
            dataScopeVO.setHouseholdIds(new ArrayList<>());
            dataScopeVO.setUserIds(new ArrayList<>());
            
            // 设置描述信息
            dataScopeVO.setDescription(String.format("用户%d可访问%d个社区", userId, communityIds.size()));
        } else if (isSuperAdmin) {
            // 超级管理员拥有所有权限
            dataScopeVO.setDescription("超级管理员拥有所有数据权限");
        } else {
            // 普通用户无权限
            dataScopeVO.setDescription("普通用户无数据权限");
        }
        
        log.info("用户{}的数据权限范围：{}", userId, dataScopeVO.getDescription());
        return dataScopeVO;
    }
} 